#!/bin/bash
set -e

# Helm chart inflator

# Reads a file like this
#
#  apiVersion: kustomize.config.k8s.io/v1
#  kind: ChartInflatorExec
#  metadata:
#    name: notImportantHere
#  chartName: nameOfStableChart
#  values: /abs/path/to/local/values/file
#  chartHome: /abs/path/local/chart/storage
#  helmHome: /abs/path/to/helm/config
#  helmBin: /abs/path/to/helmBin
#
# fetches the given chart from stable/$chartName,
# and inflates it to stdout, using the given values file.
#
# chartDir default: $TMP_DIR/charts
# chartDir default:

# Example execution:
# ./plugins/kustomize.config.k8s.io/v1/ChartInflatorExec configFile.yaml


# Yaml parsing is a ridiculous thing to do in bash,
# but let's try:
function parseYaml {
  local file=$1
  while read -r line
  do
    local k=${line%:*}
    local v=${line#*:}

    [ "$k" == "chartName" ] && chartName=$v
    [ "$k" == "chartHome" ] && chartHome=$v
    [ "$k" == "values" ] && valuesFile=$v
    [ "$k" == "helmHome" ] && helmHome=$v
    [ "$k" == "helmBin" ] && helmBin=$v
  done <"$file"

  # Trim leading space
  chartName="${chartName#"${chartName%%[![:space:]]*}"}"
  chartHome="${chartHome#"${chartHome%%[![:space:]]*}"}"
  valuesFile="${valuesFile#"${valuesFile%%[![:space:]]*}"}"
  helmBin="${helmBin#"${helmBin%%[![:space:]]*}"}"
}

TMP_DIR=$(mktemp -d)

parseYaml $1

# Where all the files generated by 'helm init' live.
if [ -z "$helmHome" ]; then
  helmHome=$TMP_DIR/dotHelm
fi

# Where helm charts are unpacked.
if [ -z "$chartHome" ]; then
  chartHome=$TMP_DIR/charts
fi

if [ -z "$helmBin" ]; then
  helmBin=helm
fi

if [ -z "$valuesFile" ]; then
  valuesFile=$chartHome/$chartName/values.yaml
fi

function doHelm {
  $helmBin --home $helmHome $@
}

# The init command is extremely chatty
doHelm init --client-only >& /dev/null

if [ ! -d "$chartHome/$chartName" ]; then
  doHelm fetch --untar \
      --untardir $chartHome \
      stable/$chartName
fi

doHelm template \
    --values $valuesFile \
    $chartHome/$chartName

/bin/rm -rf $TMP_DIR
